const INVALID_TICKET_NUMS = ["无", "--", "0", "", "-"]; // 定义所有被认为是“无票”的无效值

/**
 * 筛选有余票的车次，并按照指定格式返回。
 * @param {Array} originalResults - 原始的火车票查询结果数组。
 * @param {string} queryName - 查询组的名称，例如 "深圳-潜山"。
 * @param {string} searchDate - 查询的日期，格式为 "YYYY-MM-DD"。
 * @param {Array} trains - 需要筛选的车次数组，例如 ["G2694"]。
 * @returns {Array} - 格式化后的、包含有余票信息的数组。
 */
export function formatAvailableTickets(
  originalResults,
  queryName,
  searchDate,
  trains
) {
  if (!Array.isArray(originalResults)) {
    console.error("Invalid originalResults: not an array");
    return [];
  }
  originalResults = originalResults.filter((train) =>
    trains.includes(train.车次)
  );

  const formattedList = [];

  // 遍历原始查询结果中的每一条车次信息
  for (const item of originalResults) {
    const availableSeats = {}; // 用于存储该车次的有余票席位信息

    // 遍历该车次的“票列表”
    for (const ticketType in item.票列表) {
      if (Object.hasOwnProperty.call(item.票列表, ticketType)) {
        const ticketInfo = item.票列表[ticketType];
        // 检查票数（num）是否为有效值
        if (!INVALID_TICKET_NUMS.includes(ticketInfo.num)) {
          // 如果有效，则将席位和票数存入 availableSeats 对象
          // .trim() 用于去除 "优 选一等座" 等键名中可能存在的空格
          availableSeats[ticketType.trim()] = ticketInfo.num;
          // availableSeats.价格 = ticketInfo.price;
        }
      }
    }

    // 如果 availableSeats 对象不为空，说明该车次有余票
    if (Object.keys(availableSeats).length > 0) {
      // 按照指定的格式创建新的对象，并添加到结果列表中
      formattedList.push({
        查询组: queryName,
        日期: searchDate,
        车次: item.车次,
        出发地: item.出发站,
        到达地: item.到达站,
        出发时间: item.出发时间,
        到达时间: item.到达时间,
        余票席位: availableSeats,
      });
    }
  }

  // 对结果进行排序：有“二等座”、“软卧”或“硬卧”的排在前面
  formattedList.sort((a, b) => {
    const hasPriorityTicket = (seats) =>
      Object.prototype.hasOwnProperty.call(seats, "二等座") ||
      Object.prototype.hasOwnProperty.call(seats, "软卧") ||
      Object.prototype.hasOwnProperty.call(seats, "硬卧");

    const aHasPriority = hasPriorityTicket(a.余票席位);
    const bHasPriority = hasPriorityTicket(b.余票席位);

    if (aHasPriority && !bHasPriority) {
      return -1; // a 排在 b 前面
    }
    if (!aHasPriority && bHasPriority) {
      return 1; // b 排在 a 前面
    }
    return 0; // 保持原有相对顺序
  });

  return formattedList;
}

/**
 * 格式化当前日期和时间。
 * @param {string} [type='date'] - 需要的格式类型。'full' 返回完整时间戳 (YYYY-MM-DD HH:mm:ss)，'date' 返回日期 (YYYY-MM-DD)。
 * @returns {string} 格式化后的日期/时间字符串。
 */
export const formatCurrentDate = (type = "date") => {
  const now = new Date();

  // 日期部分是共用的
  const year = now.getFullYear();
  const month = (now.getMonth() + 1).toString().padStart(2, "0");
  const day = now.getDate().toString().padStart(2, "0");
  const datePart = `${year}-${month}-${day}`;

  // 根据类型参数决定是否附加时间部分
  if (type === "full") {
    const hours = now.getHours().toString().padStart(2, "0");
    const minutes = now.getMinutes().toString().padStart(2, "0");
    const seconds = now.getSeconds().toString().padStart(2, "0");
    return `${datePart} ${hours}:${minutes}:${seconds}`;
  }

  // 默认情况下（或 type === 'date'），只返回日期部分
  return datePart;
};
